package org.dxy.middleware.dynamic.thread.pool.infrastructure.config;

import lombok.extern.slf4j.Slf4j;
import org.dxy.middleware.dynamic.thread.pool.type.AdapterType;
import org.dxy.middleware.dynamic.thread.pool.type.AdapterTypeConstants;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

/**
 * @ description: 用于在 Spring 容器中根据配置决定是否加载某个适配器 Bean。
 * 工作流程：
 * 1. 从 Spring Environment 中读取 adapter.type 属性。
 * 2. 获取当前 Bean 上的 @AdapterType 注解的 value 值。
 * 3. 比较两者是否相等，决定是否加载该 Bean。
 *
 * @ author: dxy
 * @ createTime: 2025/10/1 23:52
 */
@Slf4j
public class AdapterTypeCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
//        log.info("AdapterTypeCondition: 开始匹配 Bean {}", metadata.getClass().getSimpleName());

        // 从配置读取当前激活的适配器类型
        String activeAdapter = context.getEnvironment().getProperty(AdapterTypeConstants.ADAPTER_TYPE_PROPERTY);

        if (activeAdapter == null) {
            log.warn("AdapterTypeCondition: adapter.type 配置不存在，跳过加载 Bean");
            return false; // 没有配置时不加载
        }

        // 获取注解上的 value 属性
        Object value = metadata.getAnnotationAttributes(AdapterType.class.getName())
                .get(AdapterTypeConstants.ADAPTER_TYPE_ANNOTATION_VALUE);

//        log.info("AdapterTypeCondition: Bean 标注的 AdapterType = {}", value);

        if (value == null) {
            log.warn("AdapterTypeCondition: 注解 AdapterType 的 value 属性为空，跳过加载 Bean");
            return false; // 注解没有值时不加载
        }

        boolean match = value.toString().equalsIgnoreCase(activeAdapter);
//        log.info("适配器类型匹配检查：Bean={} | 标注的适配器类型={} | 配置的适配器类型={} | 匹配结果={}",
//                metadata.getClass().getSimpleName(),
//                value, activeAdapter, match);


        return match;
    }
}
